package jmine.tec.report.api.table;

import java.util.List;

import jmine.tec.report.api.RendererTarget;

/**
 * Interface de grupos de dados dentro de uma tabela. Deve ser usado para criar linhas antes e depois de determinados grupos de registros,
 * em geral para criar sub-cabeçalhos e sub-totais.<br/>
 * O grupo atua como um listener. Enquanto a tabela itera seus registros para gerar linhas, os grupos são chamados para que possam atuar no
 * processo.<br/>
 * 
 * @param <V> tipo de valor recebido pelo grupo
 * @author lundberg
 */
public interface ReportTableGroup<V> extends RendererTarget {

    /**
     * Verifica se o próximo registro caracteriza uma mudança de grupo, e por consequência os métodos onGroupEnd e onGroupStart devem ser
     * chamado antes do processamento do próximo registro.
     * 
     * @param nextRecord próximo registro
     * @return boolean
     */
    boolean isGroupChange(V nextRecord);

    /**
     * Retorna a lista de linhas que deve ser impressa antes do próximo grupo de registros, cujo primeiro registro foi o último processado.
     * 
     * @return lista de linhas que deve ser impressa antes do próximo grupo.
     */
    List<ReportRow> onGroupStart();

    /**
     * Processa o registro
     * 
     * @param record registro
     */
    void processRecord(V record);

    /**
     * Retorna a lista de linhas que deve ser impressa após o grupo, cujo último registro foi o último processado.
     * 
     * @return lista de linhas que deve ser impressa após o grupo.
     */
    List<ReportRow> onGroupEnd();

    /**
     * Adiciona uma célula ao cabeçalho do grupo, que deve aparecer na posição da coluna dada.
     * 
     * @param column column
     * @param groupCell groupCell
     */
    void addHeaderCell(ReportColumn<V> column, ReportTableGroupCell<V> groupCell);

    /**
     * Adiciona uma célula ao rodapé do grupo, que deve aparecer na posição da coluna dada.
     * 
     * @param column column
     * @param groupCell groupCell
     */
    void addFooterCell(ReportColumn<V> column, ReportTableGroupCell<V> groupCell);
}
